﻿/*
表格排序，使用方法参考： http://blog.163.com/wangjia_419/blog/static/20044165201081533259380/
整理：邓太华 2010.12.12
使用示例：
HTML：
<th><a href="#" onclick="mySortTable.SortByCol(1,'int');">Number</a></th>
<th><a href="#" onclick="mySortTable.SortByCol(2);">String</a></th>
JS：
var mySortTable = new SortTableClass("sortTable1");

// 如果想测试执行时间，请引用JS文件 NbfCommon.js
// 正式使用，请注释掉  CalcExecuteTime(); 相关代码
*/
function SortTableClass(tableID) {

    var sorttype = 1; //desc
    var currTable = document.getElementById(tableID);
    var tableRows = new Array();
    //开始计算排序时间
    var calcTime = new CalcExecuteTime();

    //init table data
    function initTable() {
        var cellLength = currTable.rows[0].cells.length;
        for (var i = 0; i < currTable.rows.length; i++) {
            tableRows[i] = new Array();
            var row = currTable.rows[i];
            for (var j = 0; j < cellLength; j++) {
                tableRows[i][j] = GetCellData(row.cells[j]);
            }
        }

    }

    initTable(); 
    

    //获取单元格数据
    function GetCellData(cell) {
        var cellObj = cell.childNodes[0];
        var Value = "";
        var html = null;
        if (cellObj) {
            html = cellObj.nodeName == "#text" ? cellObj.data : cellObj.innerHTML;
            if (html) {
                if (html == "--") {
                    Value = -99999; //-- 表示没有数据，排序的话设置为最小值
                }
                else {
                    var char = html.charAt(html.length - 1);
                    if (char == "%")
                        Value = html.substring(0, html.length - 1);
                    else
                        Value = html;
                }

            }

        }
        return { "html": cell.innerHTML, "data": Value };
    }

    //排序后的事件
    function onSorted() {
        //dth 增加的代码
        //为第0列重新设置文字
        //                for (var i = 0; i < currTable.rows.length; i++) {
        //                    currTable.rows[i].cells[0].innerHTML = (i + 1);
        //                }
    };

    //为指定列排序
    function sortByCol(nColNum, strDataType) { //排序
        add_loading();
        

        BubbleSort(tableRows, nColNum, strDataType, sorttype);
        sorttype = 0 - sorttype; //asc

        
        //alert("内存排序时间");
        //--------------------------------------------------------
        /*
        calcTime.Begin();
        afterSort();
        this.OnSorted();
        //显示排序时间
        calcTime.Print("divPageLoadTime");
        alert("表格呈现时间");
        */
        //由于表格呈现比较慢，所以需要延时执行，否则页面其它事件无法执行。
        setTimeout(afterSort, 100);
    };


    function getCellDataByType1(obj, strDataType) {

        switch (strDataType) {
            case "int":
                return parseInt(obj.data);
            case "float":
                return parseFloat(obj.data);
            case "string":
                return obj.data.toString();
            default:
                return obj.data;
        }
    }

    //==============表格排序（算法：选择排序）by dengtaihua 2011.2.13 =============
    function BubbleSort(table, nColNum, strDataType, nSortOrder) { //冒泡排序
        //var length = table.rows.length;
        var length = table.length;
        var find = false;
        var objIndex = 0;
        var temp_x = 0;
        var temp_y = 0;

        for (var i = 0; i < length - 1; i++) {
            temp_x = getCellDataByType1(tableRows[i][nColNum], strDataType);
            objIndex = i;
            //var temp_x = x; //当前行的值

            for (var j = i + 1; j < length; j++) {
                temp_y = getCellDataByType1(tableRows[j][nColNum], strDataType);
                //temp_y : 待比较行的值

                find = false;
                if (nSortOrder > 0) {//desc
                    if (temp_x < temp_y)
                        find = true; //寻找比当前行值小的最大索引
                }
                else {
                    if (temp_x > temp_y)
                        find = true;  //寻找比当前行值大的最大索引
                }

                if (find) {
                    objIndex = j;
                    temp_x = temp_y;
                }

            }
            if (objIndex != i) {
                //找到目标行，进行交换
                SwapRow1(table, i, objIndex);

            }
        }
    }

    /*
    //table.moveRow 太慢，其它浏览器也不支持
    function SwapRow(table, x, y) {
    if (x > y) {//升
    table.moveRow(x, y);
    table.moveRow(y + 1, x);
    }
    else {
    table.moveRow(x, y);
    table.moveRow(y - 1, x);
    }
    }

*/
    function SwapRow1(table, x, y) {
        var temp_row = table[x];
        table[x] = table[y];
        table[y] = temp_row;
    }

    //排序完成之后，重新设置单元格的内容
    function afterSort() {
        var cellLength = currTable.rows[0].cells.length;
        for (var i = 0; i < currTable.rows.length; i++) {
            var row = currTable.rows[i];
            for (var j = 0; j < cellLength; j++)
                row.cells[j].innerHTML = tableRows[i][j].html;

        }
        
        remove_loading();
    }

//创建公共方法的声明
    this.OnSorted = onSorted;
    this.SortByCol = sortByCol;

    //隐藏loading...层
    function remove_loading() {
        var targelem = document.getElementById("loading");
        if (targelem != null) {
            targelem.style.display = "none";
            targelem.style.visibility = "hidden";
        }
        calcTime.Print("divPageLoadTime");
    }
    //加载loading...层
    function add_loading() {
        calcTime.Begin();
        var targelem = document.getElementById("loading");
        if (targelem != null) {
            targelem.style.display = "block";
            targelem.style.visibility = "visible";
        }
    }
}

